package com.codebuffer.nowcoder;

public class Match {
    /**
     * 代码中的类名、方法名、参数名已经指定，请勿修改，直接返回方法规定的值即可
     *
     *
     * @param str string字符串
     * @param pattern string字符串
     * @return bool布尔型
     */
    public static boolean match (String str, String pattern) {
        // write code here
        int s = str.length();
        int p = pattern.length();
        boolean[][] dp = new boolean[s+1][p+1];
        for(int i = 0;i<=s;i++){
            for(int j =0;j<=p;j++){
                if(j==0){
                    dp[i][j] = (i==0);
                }else {
                    if(pattern.charAt(j-1)!='*'){
                        if(i>1 && (str.charAt(i-1) == pattern.charAt(j-1) || pattern.charAt(j-1)=='.')){
                            dp[i][j] = dp[i-1][j-1];
                        }
                    }else {
                        if(j>2){
                            dp[i][j] = dp[i][j-2];
                        }
                        if(i >= 1 && j >= 2&& (str.charAt(i-1) == pattern.charAt(j-2) || pattern.charAt(j-2)=='.')){
                            dp[i][j] |= dp[i-1][j];
                        }
                    }
                }
            }
        }
        return dp[str.length()][pattern.length()];
    }

    public static void main(String[] args) {
        System.out.println(match("aaa","a*a"));
    }
}

/**
 *    public static boolean match (String str, String pattern) {
 *         // write code here
 *         int s = str.length();
 *         int p = pattern.length();
 *         boolean[][] dp = new boolean[s+1][p+1];//00 用于存放两个空字符串的结果 dp[i][j] 表示模式串前j个是否与字符串前i个匹配
 *         for(int i = 0;i<=s;i++){//实际上模式串和字符串的起点为1(所以后面的下标都是i-1 j-1)
 *             for(int j =0;j<=p;j++){
 *                 if(j==0){
 *                     dp[i][j]=(i==0);//只有字符串和模式串都为空的时候才匹配，当模式串为空，字符串不为空则返回false
 *                 }else{
 *                     if(pattern.charAt(j-1)!='*'){//如果第j-1个字符不是*
 *                         if(i>0&&(str.charAt(i-1)==pattern.charAt(j-1)||pattern.charAt(j-1)=='.')){
 *                             //正常匹配
 *                             dp[i][j] = dp[i-1][j-1];
 *                         }
 *                     }else{//如果第j个是* 那么分两种情况，有一种成立即可
 *                         //case 1 可以直接忽略*前模式的那个元素（*代表出现0次 比如a* 这两个元素做空字符串）
 * //                         那么dp[i][j]==true 只需满足 dp[i][j-2]==true即可
 *                         if(j>=2){
 *                             dp[i][j] = dp[i][j-2];
 *                         }
 *                         //case 2 如果dp[i][j-2]不等于true那么要满足第j-1个字符(这个字符也可以为‘.’)与第i个字符匹配即可
 *                         //下标多减1是因为dp是从1开始记录的
 *                         if(i>0 && j>=2 &&(str.charAt(i-1)==pattern.charAt(j-2)||pattern.charAt(j-2)=='.')){
 *                             dp[i][j] |= dp[i-1][j];//使用或等于 两种情况有一种符合就行
 *                         }
 *                     }
 *                 }
 *
 *
 *
 *             }
 *         }
 *         return dp[str.length()][pattern.length()];
 *     }
 **/